/**
 * 作者: chenlingzhi
 * 日期: 2023-04-12 17:46:07
 * 备注: 活动表
 */
package com.motu.monstercity.server.game.commondata.act;

import com.motu.monstercity.module.common.utility.Constant;
import com.motu.vertx.module.utility.toolset.TimeUtils;
import com.motu.vertx.module.utility.toolset.Tool;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class Act extends ActModel {
	public static final int ACT_TYPE_MAINTAIN = 1; // 维护补偿活动(登陆发送邮件奖励)
	public static final int ACT_TYPE_PUSH_GIFT = 2; // 推送礼包
	public static final int ACT_TYPE_SEVEN_DAYS = 7; // 七天乐

	public static final int ACT_TYPE_MOTIF = 1002; // 主题活动


	private ConcurrentHashMap<Long, ActDetail> actDetailMap = new ConcurrentHashMap<>(); // 活动明细表

	public Act(JsonObject obj) {
		super(obj);
	}

	public void addDetail(ActDetail detail) {
		actDetailMap.put(detail.getId(), detail);
	}

	public ConcurrentHashMap<Long, ActDetail> getActDetailMap() {
		return actDetailMap;
	}

	public ActDetail getActDetail(long detailId) {
		return actDetailMap.get(detailId);
	}

	/**
	 * 是否包含服务器ID
	 * @param serverId 服务器ID
	 */
	public boolean isContainServer(int serverId) {
		boolean contain = false;// 是否包含
		if (getRangType() == Constant.ACT_RTYPE_ALL) {
			contain = true;
		} else if (getRangType() == Constant.ACT_RTYPE_IN) {
			JsonArray jsonArray = new JsonArray(getRang());
			if (jsonArray.contains(serverId)) {
				contain = true;
			}
		} else if (getRangType() == Constant.ACT_RTYPE_NOTIN) {
			JsonArray jsonArray = new JsonArray(getRang());
			if (!jsonArray.contains(serverId)) {
				contain = true;
			}
		}
		return contain;
	}

	/**
	 * 是否在展示时间内
	 * @param userInfo
	 * @return
	 */
//	public boolean isShowtime(UserInfo userInfo, UserExtInfo userExtInfo) {
//		boolean contain = isContainServer(userInfo.getServerId());// 是否包含
//		if (contain) {
//			int curTime = TimeUtils.getCurTime();
//			if (userExtInfo.isGM() && curTime <= getEndTime()){
//				return true;
//			}
//			if (curTime >= getShowTime() && curTime <= getEndTime()) {
//				return true;
//			}
//		}
//		return false;
//	}

	/**
	 * 活动是否开启
	 * @param serverId
	 * @return
	 */
	public boolean isStart(int serverId) {
		return isStart(serverId, TimeUtils.getCurTime());
	}

	/**
	 * 活动是否开启
	 * @param serverId
	 * @param curTime
	 * @return
	 */
	public boolean isStart(int serverId, long curTime) {
		// 判断本服是否有活动
		boolean contain = isContainServer(serverId);
		if (contain) {
			long endTime = getEndTime();
			if (curTime >= getStartTime() && curTime <= endTime) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断活动是否未结算
	 * @param serverId
	 * @return
	 */
	public boolean isGetRewardTime(int serverId) {
		return isGetRewardTime(serverId, TimeUtils.getCurTime());
	}

	/**
	 * 判断活动是否未结算
	 * @param serverId
	 * @param curTime
	 * @return
	 */
	public boolean isGetRewardTime(int serverId, long curTime) {
// 判断本服是否有活动
		boolean contain = isContainServer(serverId);
		if (contain) {
			long endTime = getCloseTime();
            return curTime >= getStartTime() && curTime <= endTime;
		}
		return false;
	}

	/**
	 * 活动是否开启
	 */
	public boolean isStart() {
		long curTime = TimeUtils.getCurTime();
		long endTime = getEndTime();
		if (curTime >= getStartTime() && curTime <= endTime) {
			return true;
		}
		return false;
	}

	/**
	 * 是否在结算时间内
	 * @return
	 */
	public boolean isCloseTime() {
		long curTime = TimeUtils.getCurTime();
		if (curTime >= getStartTime() && curTime < getCloseTime()) {
			return true;
		}
		return false;
	}


	/**
	 * 今天是活动的第几天
	 * @return
	 */
	public int getDiffDays() {
		return TimeUtils.getDiffDay(startTime, TimeUtils.getCurTime()) + 1;
	}

	public List<ActDetail> getSortDetailList() {
		List<ActDetail> sortList = new ArrayList<ActDetail>(actDetailMap.values());
		Collections.sort(sortList, new Comparator<ActDetail>() {
			public int compare(ActDetail o1, ActDetail o2) {
				return Integer.compare(o1.getSort(), o2.getSort());
			}
		});
		return sortList;
	}

	/**
	 * 获取活动通用参数
	 * @return
	 */
	public int getActParamValue() {
		if (Tool.isEmpty(param)) {
			return 0;
		}
		try {
			return Integer.parseInt(param);
		} catch (Exception e) {
			return 0;
		}
	}

	/**
	 * 获取活动通用参数
	 * @return
	 */
	public int[] getActParamArray() {
		if (Tool.isEmpty(param)) {
			return null;
		}
		try {
			return Tool.strToIntArray(param, ";");
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 获取消耗类型
	 * @return
	 */
	public byte getConsumeType() {
		if (Tool.isEmpty(param)) {
			return 0;
		}
		try {
			JsonObject obj = new JsonObject(param);
			return obj.getInteger("type").byteValue();
		} catch (Exception e) {
			return Byte.parseByte(param);
		}
	}

	/**
	 * 是否在展示时间内
	 */
	public boolean isShowtime(int serverId) {
		boolean contain = isContainServer(serverId);// 是否包含
		if (contain) {
			long curTime = TimeUtils.getCurTime();
			if (curTime >= getShowTime() && curTime <= getEndTime()) {
				return true;
			}
		}
		return false;
	}

}
